package ai.tuobot.sdk.util

import android.content.Context
import java.io.File
import java.io.FileOutputStream
import java.io.IOException
import java.io.OutputStream

/**
 * 功能函数扩展类。
 */
object FucUtil {
    /**
     * 将assets目录下文件读取到字符串。
     *
     * @param context 上下文
     * @param file 文件路径
     * @param code 字符编码
     * @return 字符串
     */
    fun readAssetFile(context: Context, file: String?, code: String?): String {
        val len: Int
        val buf: ByteArray
        var result = ""

        try {
            val `in` = context.assets.open(file!!)
            len = `in`.available()
            buf = ByteArray(len)
            `in`.read(buf, 0, len)

            result = String(buf, charset(code!!))
        } catch (e: Exception) {
            e.printStackTrace()
        }

        return result
    }

    /**
     * 将assets下的目录拷贝到目标目录。
     *
     * @param context 上下文
     * @param srcName 源目录
     * @param dstName 目标目录
     * @return 是否成功
     */
    fun copyAssetFolder(context: Context, srcName: String, dstName: String): Boolean {
        try {
            var result: Boolean
            val fileList = context.assets.list(srcName) ?: return false

            if (fileList.size == 0) {
                result = copyAssetFile(context, srcName, dstName)
            } else {
                val file = File(dstName)
                result = file.mkdirs()
                for (filename in fileList) {
                    result = result and copyAssetFolder(
                        context, srcName + File.separator + filename,
                        dstName + File.separator + filename
                    )
                }
            }
            return result
        } catch (e: IOException) {
            e.printStackTrace()
            return false
        }
    }

    /**
     * 将assets下面的文件拷贝到目标文件。
     *
     * @param context 上下文
     * @param srcName 源文件
     * @param dstName 目标文件
     * @return 是否成功
     */
    fun copyAssetFile(context: Context, srcName: String?, dstName: String?): Boolean {
        try {
            val `in` = context.assets.open(srcName!!)
            val outFile = File(dstName)

            if (!outFile.parentFile.exists()) {
                outFile.parentFile.mkdirs()
            }

            val out: OutputStream = FileOutputStream(outFile)
            val buffer = ByteArray(1024)
            var read: Int

            while ((`in`.read(buffer).also { read = it }) != -1) {
                out.write(buffer, 0, read)
            }

            `in`.close()
            out.close()

            return true
        } catch (e: IOException) {
            e.printStackTrace()

            return false
        }
    }
}
